home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / ARPCMD.C < prev    next >
C/C++ Source or Header  |  1989-08-19  |  4KB  |  191 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "timer.h"
  6. #include "enet.h"
  7. #include "ax25.h"
  8. #include "arp.h"
  9. #include "netuser.h"
  10. #include "cmdparse.h"
  11. #include "commands.h"
  12.  
  13. extern char Badhost[];
  14. extern char Nospace[];
  15.  
  16. static int doarpadd __ARGS((int argc,char *argv[],void *p));
  17. static int doarpdrop __ARGS((int argc,char *argv[],void *p));
  18. static void dumparp __ARGS((void));
  19.  
  20. static struct cmds Arpcmds[] = {
  21.     "add", doarpadd, 0, 4,
  22.     "arp add <hostid> ether|ax25|netrom <ether addr|callsign>",
  23.  
  24.     "drop", doarpdrop, 0, 3,
  25.     "arp drop <hostid> ether|ax25|netrom",
  26.  
  27.     "publish", doarpadd, 0, 4,
  28.     "arp publish <hostid> ether|ax25|netrom <ether addr|callsign>",
  29.  
  30.     NULLCHAR,
  31. };
  32. char *Arptypes[] = {
  33.     "NET/ROM",
  34.     "10 Mb Ethernet",
  35.     "3 Mb Ethernet",
  36.     "AX.25",
  37.     "Pronet",
  38.     "Chaos",
  39.     "Arcnet",
  40.     "Appletalk"
  41. };
  42.  
  43. int
  44. doarp(argc,argv,p)
  45. int argc;
  46. char *argv[];
  47. void *p;
  48. {
  49.     if(argc < 2){
  50.         dumparp();
  51.         return 0;
  52.     }
  53.     return subcmd(Arpcmds,argc,argv,p);
  54. }
  55. static
  56. doarpadd(argc,argv,p)
  57. int argc;
  58. char *argv[];
  59. void *p;
  60. {
  61.     int16 hardware;
  62.     int32 addr;
  63.     char *hwaddr;
  64.     struct arp_tab *ap;
  65.     struct arp_type *at;
  66.     int pub = 0;
  67.  
  68.     if(argv[0][0] == 'p')    /* Is this entry published? */
  69.         pub = 1;
  70.     if((addr = resolve(argv[1])) == 0){
  71.         printf(Badhost,argv[1]);
  72.         return 1;
  73.     }
  74.     /* This is a kludge. It really ought to be table driven */
  75.     switch(tolower(argv[2][0])){
  76.     case 'n':    /* Net/Rom pseudo-type */
  77.         hardware = ARP_NETROM;
  78.         break;
  79.     case 'e':    /* "ether" */
  80.         hardware = ARP_ETHER;
  81.         break;        
  82.     case 'a':    /* "ax25" */
  83.         hardware = ARP_AX25;
  84.         break;
  85.     case 'm':    /* "mac appletalk" */
  86.         hardware = ARP_APPLETALK;
  87.         break;
  88.     default:
  89.         printf("unknown hardware type \"%s\"\n",argv[2]);
  90.         return -1;
  91.     }
  92.     /* If an entry already exists, clear it */
  93.     if((ap = arp_lookup(hardware,addr)) != NULLARP)
  94.         arp_drop(ap);
  95.  
  96.     at = &Arp_type[hardware];
  97.     if(at->scan == NULLFP){
  98.         printf("Attach device first\n");
  99.         return 1;
  100.     }
  101.     /* Allocate buffer for hardware address and fill with remaining args */
  102.     if((hwaddr = malloc(at->hwalen)) == NULLCHAR){
  103.         printf(Nospace);
  104.         return 0;
  105.     }
  106.     /* Destination address */
  107.     (*at->scan)(hwaddr,argv[3]);
  108.     ap = arp_add(addr,hardware,hwaddr,at->hwalen,pub);    /* Put in table */
  109.     free(hwaddr);                    /* Clean up */
  110.     stop_timer(&ap->timer);            /* Make entry permanent */
  111.     ap->timer.count = ap->timer.start = 0;
  112.     return 0;
  113. }
  114. /* Remove an ARP entry */
  115. static
  116. doarpdrop(argc,argv,p)
  117. int argc;
  118. char *argv[];
  119. void *p;
  120. {
  121.     int16 hardware;
  122.     int32 addr;
  123.     struct arp_tab *ap;
  124.  
  125.     if((addr = resolve(argv[1])) == 0){
  126.         printf(Badhost,argv[1]);
  127.         return 1;
  128.     }
  129.     /* This is a kludge. It really ought to be table driven */
  130.     switch(tolower(argv[2][0])){
  131.     case 'n':
  132.         hardware = ARP_NETROM;
  133.         break;
  134.     case 'e':    /* "ether" */
  135.         hardware = ARP_ETHER;
  136.         break;        
  137.     case 'a':    /* "ax25" */
  138.         hardware = ARP_AX25;
  139.         break;
  140.     case 'm':    /* "mac appletalk" */
  141.         hardware = ARP_APPLETALK;
  142.         break;
  143.     default:
  144.         hardware = 0;
  145.         break;
  146.     }
  147.     if((ap = arp_lookup(hardware,addr)) == NULLARP)
  148.         return -1;
  149.     arp_drop(ap);
  150.     return 0;    
  151. }
  152. /* Dump ARP table */
  153. static void
  154. dumparp()
  155. {
  156.     register int i;
  157.     register struct arp_tab *ap;
  158.     char e[128];
  159.  
  160.     printf("received %u badtype %u bogus addr %u reqst in %u replies %u reqst out %u\n",
  161.      Arp_stat.recv,Arp_stat.badtype,Arp_stat.badaddr,Arp_stat.inreq,
  162.      Arp_stat.replies,Arp_stat.outreq);
  163.  
  164.     printf("IP addr         Type           Time Q Addr\n");
  165.     for(i=0;i<ARPSIZE;i++){
  166.         for(ap = Arp_tab[i];ap != (struct arp_tab *)NULL;ap = ap->next){
  167.             printf("%-16s",inet_ntoa(ap->ip_addr));
  168.             printf("%-15s",smsg(Arptypes,NHWTYPES,ap->hardware));
  169.             printf("%-5ld",read_timer(&ap->timer)*(long)MSPTICK/1000);
  170.             if(ap->state == ARP_PENDING)
  171.                 printf("%-2u",len_q(ap->pending));
  172.             else
  173.                 printf("  ");
  174.             if(ap->state == ARP_VALID){
  175.                 if(Arp_type[ap->hardware].format != NULLFP){
  176.                     (*Arp_type[ap->hardware].format)(e,ap->hw_addr);
  177.                 } else {
  178.                     e[0] = '\0';
  179.                 }
  180.                 printf("%s",e);
  181.             } else {
  182.                 printf("[unknown]");
  183.             }
  184.             if(ap->pub)
  185.                 printf(" (published)");
  186.             printf("\n");
  187.         }
  188.     }
  189.     return;
  190. }
  191.